package com.ch.android.lookforkotlinv2.fragment

import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import com.ch.android.lookforkotlinv2.R
import com.ch.android.lookforkotlinv2.adapter.SquarePageAdapter
import com.ch.android.lookforkotlinv2.databinding.FragmentSquareBinding
import com.ch.android.lookforkotlinv2.vm.SquareModel
import com.ch.android.networklib.data.LiveTypeData
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator

/**
 * `ViewModelProvider(this).get(SquareModel::class.java)` 和 `SquareModel(requireActivity().application)` 这两种方式都是用来获取 `SquareModel` 的实例，但是它们的工作方式有所不同。
 *
 * 1. `ViewModelProvider(this).get(SquareModel::class.java)`：这种方式是通过 `ViewModelProvider` 来获取 `SquareModel` 的实例。`ViewModelProvider` 是 Android Architecture Components 提供的一个类，它的主要作用是创建和获取 `ViewModel`。当你通过这种方式获取 `ViewModel` 时，如果 `ViewModel` 已经存在，那么 `ViewModelProvider` 会直接返回已经存在的 `ViewModel`，否则它会创建一个新的 `ViewModel`。这种方式的优点是可以保证在配置更改（如屏幕旋转）后，你仍然可以获取到同一个 `ViewModel` 实例。
 *
 * 2. `SquareModel(requireActivity().application)`：这种方式是直接创建一个新的 `SquareModel` 实例。每次调用这种方式，都会创建一个新的 `SquareModel` 实例。这种方式的缺点是在配置更改后，你将无法获取到之前的 `ViewModel` 实例。
 *
 * 因此，如果你希望在配置更改后仍然可以获取到同一个 `ViewModel` 实例，那么你应该使用 `ViewModelProvider(this).get(SquareModel::class.java)`。如果你不需要这个特性，那么你可以直接使用 `SquareModel(requireActivity().application)` 来创建 `ViewModel`。
 */
class SquareFragment : Fragment() {
    private lateinit var mBinding: FragmentSquareBinding
    private lateinit var mSquarePageAdapter: SquarePageAdapter
    private val liveTypes = mutableListOf<LiveTypeData>()

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
        mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_square, container, false)
        mBinding.lifecycleOwner = this // 这里的 this 指的是 Fragment

        mSquarePageAdapter = SquarePageAdapter(this, liveTypes)
        mBinding.squareViewPager.adapter = mSquarePageAdapter

        TabLayoutMediator(mBinding.squareTab, mBinding.squareViewPager) { tab: TabLayout.Tab, position: Int ->
            tab.setText(liveTypes[position].name)
        }.attach()

        // 【使用ViewModelProvider的好处】
        // https://tongyi.aliyun.com/qianwen/share?shareId=8396c88e-e82b-414c-a60a-2a765f4d65d4
        mBinding.model = ViewModelProvider(this)[SquareModel::class.java]
        mBinding.model?.loadData()

        //监听SquareModel中的liveTypes数据变化
        mBinding.model!!.liveTypes.observe(viewLifecycleOwner) {
            liveTypes.clear()
            liveTypes.addAll(it)
            mSquarePageAdapter.notifyDataSetChanged()

        }
        mBinding.model!!.error.observe(viewLifecycleOwner) {
            Log.d("SquareFragment", "liveTypes: $it")
        }
        return mBinding.root
    }

}